package com.cysoft.third.echarts.component.yAxis;

/**
 * @author 玖零
 * @version v0.0.1
 * @project cysoft-third-echarts
 * @package com.cysoft.third.echarts.component.yAxis
 * @date 2025/3/13 11:31
 * @desc
 */
public class YAxis {

    /**
     * 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
     */
    private String id;

    /**
     * 是否显示 y 轴。
     */
    private Boolean show = true;

    /**
     * y 轴所在的 grid 的索引，默认位于第一个 grid。
     */
    private Integer gridIndex;

    /**
     * 从 v5.3.0 开始支持，在多个 y 轴为数值轴的时候，可以开启该配置项自动对齐刻度。
     * 只对 'value' 和 'log' 类型的轴有效。
     */
    private Boolean alignTicks;

    /**
     * y 轴的位置。可选：'left'，'right'，默认 grid 中的第一个 y 轴在 grid 的左侧（'left'），
     * 第二个 y 轴视第一个 y 轴的位置放在另一侧。注：若未将 yAxis.axisLine.onZero 设为 false, 则该项无法生效
     */
    private String position = "left";

    /**
     * Y 轴相对于默认位置的偏移，在相同的 position 上有多个 Y 轴的时候有用。
     * 注：若未将 yAxis.axisLine.onZero 设为 false, 则该项无法生效
     */
    private Integer offset;

    /**
     * 坐标轴类型。可选：'value' 数值轴，适用于连续数据；'category' 类目轴，适用于离散的类目数据。
     * 为该类型时类目数据可自动从 series.data 或 dataset.source 中取，或者可通过 yAxis.data 设置类目数据；
     * 'time' 时间轴，适用于连续的时序数据，与数值轴相比时间轴带有时间的格式化，在刻度计算上也有所不同，
     * 例如会根据跨度的范围来决定使用月，星期，日还是小时范围的刻度；'log' 对数轴。适用于对数数据。
     * 对数轴下的堆积柱状图或堆积折线图可能带来很大的视觉误差，并且在一定情况下可能存在非预期效果，应避免使用。
     */
    private String type = "value";

    /**
     * 坐标轴名称。
     */
    private String name;

    /**
     * 坐标轴名称显示位置。可选：'start'，'middle' 或者 'center'，'end'
     */
    private String nameLocation = "end";

    /**
     * 坐标轴名称的文字样式。
     */
    private NameTextStyle nameTextStyle;

    /**
     * 坐标轴名称与轴线之间的距离。
     */
    private Integer nameGap = 15;

    /**
     * 坐标轴名字旋转，角度值。
     */
    private Integer nameRotate;

    /**
     * 坐标轴名字的截断。
     */
    private NameTruncate nameTruncate;

    /**
     * 是否是反向坐标轴。
     */
    private Boolean inverse;

    /**
     * 坐标轴两边留白策略，类目轴和非类目轴的设置和表现不一样。
     * 类目轴中 boundaryGap 可以配置为 true 和 false。默认为 true，这时候刻度只是作为分隔线，标签和数据点都会在两个刻度之间的带(band)中间。
     * 非类目轴，包括时间，数值，对数轴，boundaryGap 是一个两个值的数组，分别表示数据最小值和最大值的延伸范围，
     * 可以直接设置数值或者相对的百分比，在设置 min 和 max 后无效。 示例：boundaryGap: ['20%', '20%']
     */
    private Object boundaryGap;

    /**
     * 坐标轴刻度最小值。可以设置成特殊值 'dataMin'，此时取数据在该轴上的最小值作为最小刻度。
     * 不设置时会自动计算最小值保证坐标轴刻度的均匀分布。在类目轴中，也可以设置为类目的序数
     * （如类目轴 data: ['类A', '类B', '类C'] 中，序数 2 表示 '类C'。也可以设置为负数，如 -3）。
     * 当设置成 function 形式时，可以根据计算得出的数据最大最小值设定坐标轴的最小值。
     */
    private Object min;

    /**
     * 坐标轴刻度最大值。可以设置成特殊值 'dataMax'，此时取数据在该轴上的最大值作为最大刻度。
     * 不设置时会自动计算最大值保证坐标轴刻度的均匀分布。在类目轴中，也可以设置为类目的序数
     * （如类目轴 data: ['类A', '类B', '类C'] 中，序数 2 表示 '类C'。也可以设置为负数，如 -3）。
     * 当设置成 function 形式时，可以根据计算得出的数据最大最小值设定坐标轴的最大值。
     */
    private Object max;

    /**
     * 只在数值轴中（type: 'value'）有效。是否是脱离 0 值比例。设置成 true 后坐标刻度不会强制包含零刻度。
     * 在双数值轴的散点图中比较有用。在设置 min 和 max 之后该配置项无效。
     */
    private Boolean scale;

    /**
     * 坐标轴的分割段数，需要注意的是这个分割段数只是个预估值，最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整。
     * 在类目轴中无效。
     */
    private Integer splitNumber = 5;

    /**
     * 自动计算的坐标轴最小间隔大小。例如可以设置成 1 保证坐标轴分割刻度显示成整数。
     * 只在数值轴或时间轴中（type: 'value' 或 'time'）有效。
     */
    private Integer minInterval;

    /**
     * 自动计算的坐标轴最大间隔大小。例如，在时间轴（（type: 'time'））可以设置成 3600 * 24 * 1000 保证坐标轴分割刻度最大为一天。
     * 只在数值轴或时间轴中（type: 'value' 或 'time'）有效。
     */
    private Integer maxInterval;

    /**
     * 强制设置坐标轴分割间隔。因为 splitNumber 是预估的值，实际根据策略计算出来的刻度可能无法达到想要的效果，
     * 这时候可以使用 interval 配合 min、max 强制设定刻度划分，一般不建议使用。无法在类目轴中使用。
     * 在时间轴（type: 'time'）中需要传时间戳，在对数轴（type: 'log'）中需要传指数值。
     */
    private Integer interval;

    /**
     * 对数轴的底数，只在对数轴中（type: 'log'）有效。
     */
    private Integer logBase = 10;

    /**
     * 从 v5.5.1 开始支持，用于指定轴的起始值。
     */
    private Integer startValue;

    /**
     * 坐标轴是否是静态无法交互。
     */
    private Boolean silent;

    /**
     * 坐标轴的标签是否响应和触发鼠标事件，默认不响应。
     */
    private Boolean triggerEvent;

    /**
     * 坐标轴轴线相关设置。
     */
    private AxisLine axisLine;

    /**
     * 坐标轴刻度相关设置。
     */
    private AxisTick axisTick;

    /**
     * 从 v4.6.0 开始支持，坐标轴次刻度线相关设置。注意：次刻度线无法在类目轴（type: 'category'）中使用。
     */
    private MinorTick minorTick;

    /**
     * 坐标轴刻度标签的相关设置。
     */
    private AxisLabel axisLabel;

    /**
     * 坐标轴在 grid 区域中的分隔线。
     */
    private SplitLine splitLine;

    /**
     * 从 v4.6.0 开始支持，坐标轴在 grid 区域中的次分隔线。次分割线会对齐次刻度线 minorTick
     */
    private MinorSplitLine minorSplitLine;

    /**
     * 坐标轴在 grid 区域中的分隔区域，默认不显示。
     */
    private SplitArea splitArea;

    /**
     * 类目数据，在类目轴（type: 'category'）中有效。如果没有设置 type，但是设置了 axis.data，则认为 type 是 'category'。
     * 如果设置了 type 是 'category'，但没有设置 axis.data，则 axis.data 的内容会自动从 series.data 中获取，这会比较方便。
     * 不过注意，axis.data 指明的是 'category' 轴的取值范围。如果不指定而是从 series.data 中获取，那么只能获取到 series.data 中出现的值。
     * 比如说，假如 series.data 为空时，就什么也获取不到。
     */
    private Object data;

    /**
     * 坐标轴指示器配置项。
     */
    private AxisPointer axisPointer;

    /**
     * 从 v5.6.0 开始支持，坐标轴 tooltip 设置，注意需设置 triggerEvent 为 true 并启用全局 option.tooltip 组件。
     */
    private Tooltip tooltip;

    /**
     * 是否开启动画。
     */
    private Boolean animation = true;

    /**
     * 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
     */
    private Integer animationThreshold = 2000;

    /**
     * 初始动画的时长，支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的初始动画效果。
     */
    private Object animationDuration = 1000;

    /**
     * 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
     */
    private String animationEasing = "cubicOut";

    /**
     * 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
     */
    private Object animationDelay;

    /**
     * 数据更新动画的时长。支持回调函数，可以通过每个数据返回不同的时长实现更戏剧的更新动画效果。
     */
    private Object animationDurationUpdate = 300;

    /**
     * 数据更新动画的缓动效果。
     */
    private String animationEasingUpdate = "cubicInOut";

    /**
     * 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
     */
    private Object animationDelayUpdate;

    /**
     * Y 轴所有图形的 zlevel 值。zlevel 用于 Canvas 分层，不同 zlevel 值的图形会放置在不同的 Canvas 中，
     * Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的 zlevel。
     * 需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
     */
    private Integer zlevel;

    /**
     * Y 轴组件的所有图形的 z 值。控制图形的前后顺序。z 值小的图形会被 z 值大的图形覆盖。
     * z 相比 zlevel 优先级更低，而且不会创建新的 Canvas。
     */
    private Integer z;
}
